Software development is an ongoing task that requires management of a variety of complex information. In practice, software development involves writing and/or modifying a number of source objects representing various aspects of the software. The source objects are ultimately transformed into runtime objects by a process called “compilation” that transforms the source objects into a form that can be used for execution of the software at runtime.
During the development and testing process, it is usual to compile the source objects numerous times. Due to the complex nature of any significant software project, the software is typically divided into parts that can be separately modified, managed, and reused. One advantage to dividing the software is that changes in one part of the software may not affect another part; therefore, time can be saved by not re-compiling the unaffected part.
However, determining which parts are unaffected turns out to be a task in itself. Development tools can track dependencies between different parts of the software. For example, a change to a software definition in a first part of the software may affect a second part of the software. Therefore, a change to the first part may require compilation of the second part, even though no direct changes were made to the second part.
In practical terms, such dependencies can become quite complex as the size of a software project grows beyond the ability of any single developer to fully understand the dependencies.
Thus, there is a need for technologies to address complex dependency scenarios.